package edu.scsw.tech.unit2;

// 完数:一个数等于它的所有真因子（除了自身）之和
// 找出1000以内的所有完数
public class PerfectNumber {

    public static void main(String[] args) {
        // 创建PerfectNumber对象
        PerfectNumber perfect = new PerfectNumber();
        System.out.println("1~1000以内的所有完数包含:");

        // 遍历1到1000的所有数，判断是否为完数
        for (int i = 1; i <= 1000; ++i) {
            if (perfect.isPerfectNumber(i)) {
                // 如果是完数，打印出来
                System.out.println(i);
            }
        }
    }

    /**
     * 判断一个数是否为完数
     * 完数：一个数等于它的所有真因子（除了自身）之和
     * @param num 要判断的数
     * @return 如果是完数，返回true；否则返回false
     */
    public boolean isPerfectNumber(int num) {
        // 小于等于0的数不是完数
        if (num <= 0) {
            return false;
        }

        int sum = 0;
        // 只需要遍历到num的一半，因为一个数的真因子不会大于其一半
        for (int i = 1; i <= num / 2; ++i) {
            if (num % i == 0) {
                // 如果i是num的真因子，则将i加到sum中
                sum += i;
            }
        }

        // 如果所有真因子之和等于num，则num是完数
        return sum == num;
    }
}
